package com.CST.service;

import com.CST.common.api.Response;
import com.CST.dto.BaseInComeDTO;
import com.CST.dto.DateDTO;
import com.CST.dto.InSourceDTO;
import com.CST.entity.BaseCost;
import com.CST.entity.BaseInCome;
import com.CST.vo.*;
import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public interface IBaseInComeService {
    Response listInComeCoefficient(DateDTO dateDTO);

    void insertBaseInCome(InSourceDTO inSourceDTO);

    List<InSourceVO> listBaseInCome(InSourceDTO inSourceDTO);
    List<ReportAllBaseCostVO> listBaseCostAndInCome(DateDTO dateDTO);
    /**
     * 科室项目收入分析报表
     * dateDTO.unitCode = bill为开单
     * dateDTO.unitCode = exe为执行
     * @param dateDTO 时间范围等其他条件
     * @param pDeptCode 父级科室编号
     * @return
     */
    List<BaseInCome> listInComeByDateAndPDeptWith(DateDTO dateDTO, String pDeptCode);

    /**
     * 科室收入分析
     * 根据父级科室编号+时间范围计算其子科室的各项收入类型
     * 包括：
     * 1.开单收入
     * 2.本执本开
     * 3.他开本执
     * 1+3.合计收入
     * 2+3.小计
     */
    List<ReportInComeAnalyseVO> listInComeByDateAndPDeptWithAnalyse(DateDTO dateDTO, String pDeptCode);

    /**
     * 根据时间范围+父级科室编号计算各个子科室收益
     * 用于科室收益分析
     * @param dateDTO
     * @param pDeptCode
     * @return
     */
    List<ReportBusinessVO> listDeptProfitByDateAndPDept(DateDTO dateDTO, String pDeptCode);

    /**
     * 收益构成分析
     * 包含门诊+住院+医技
     * @param dateDTO
     * @param pDeptCode
     * @return
     */
    List<ReportBusinessVO> listDeptProfitCompositionByDateAndPDept(DateDTO dateDTO, String pDeptCode);
    
    /**
     * 科室收入项目分析明细
     * 传入时间+父级科室+项目编号
     * 查询明细
     * 通过unitCode控制开单和执行
     */
    List<BaseInComeVO> listBaseInComeVOByDateAndPDeptGroupWithDeptAndFee(DateDTO dateDTO, String pDeptCode,String deptCode, String feeCode);

    /**
     * 保本点分析
     * @param dateDTO 时间条件
     * @param pDeptCode 科室
     * @param type 类型：住院，门诊，医技
     * @return
     */
    List<ReportPointVO> pointAnalysis(DateDTO dateDTO, String pDeptCode, Integer type);

    /**
     * 手动添加收入数据
     * @param dto
     * @return
     */
    boolean addBaseInCome(BaseInComeDTO dto);

    boolean remove(long id, int year);

    void insertBaseInComeNew(InSourceDTO inSourceDTO);
    void exportExcel(HttpServletResponse response, DateDTO dateDTO) throws IOException;
    void exportExcel1(HttpServletResponse response, DateDTO dateDTO) throws IOException;
    List<ReportAllBaseCostVO> listALLBaseCostByZDept( DateDTO dateDTO);

    List<ReportAllBaseCostVO>  test( DateDTO dateDTO);
}
